﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using orienta.Models;
using System.Data.Objects;
using orienta.Utils;
using System.Data;
using orienta.Helper;
using orienta.ViewModels;
using System.Collections;

namespace orienta.Controllers
{
    public class BandejaController : OrientaController
    {
        private GoodTireEntities db = new GoodTireEntities();

        public ActionResult Index()
        {
            if (!validar(User.Identity.Name))
            {
                return RedirectToAction("Home", "Index");
            }

            SolicitudPaso solicitudVM = new SolicitudPaso();
            solicitudVM.referencias.Add(new SolicitudReferencia());

            cargarCombos();

            SolicitudHelper helper = new SolicitudHelper();
            decimal nIdeDep = usuario.nIdeDep.Value;
            decimal nTipoActor = 0;

            DateTime fechaIni = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            DateTime fechaFin = DateTime.Now.AddDays(1);
            decimal estado = 0;

            if ("T".Equals(Request["tipo"]))
            {
                nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;
                nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                estado = Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL;
            }
            else
            {
                if ("S".Equals(Request["tipo"]))
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                else
                {
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                    estado = 76;
                }
            }
            int nroTramites = (Request["nroTramites"] == null) ? Constantes.BANDEJA_NRO_FILAS : Int32.Parse(Request["nroTramites"]);
            int nroPagina = (Request["nroPagina"] == null) ? 1 : Int32.Parse(Request["nroPagina"]);
            int nroTotalRegistros = 0;
            List<SolicitudBandeja> lista = helper.getSolicitudList(estado, nIdeDep, nTipoActor, fechaIni, fechaFin, nroTramites, nroPagina, ref nroTotalRegistros);

            ViewBag.nroTotalRegistros = nroTotalRegistros;
            ViewBag.nroPagina = nroPagina;

            int desde = ((nroPagina - 1) * nroTramites + 1);
            ViewBag.desde = desde;
            ViewBag.hasta = (nroTramites > lista.Count) ? nroTotalRegistros : desde + nroTramites - 1;


            solicitudVM.listaBandeja = lista;

            //return View(solicitudVM);
            return ReturnPartialView("Index", solicitudVM);
        }

        public ViewResult Solicitud(decimal id)
        {
            HtmlUtils htmlUtils = new HtmlUtils();
            ORIMaeSolicitud orimaesolicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == id);
            SelectList list = htmlUtils.getComboParaAtender(orimaesolicitud.nIdeEstadoSol.ToString());
            ViewBag.ParaAtender = list;
            return View(orimaesolicitud);
        }

        public ActionResult Recepcionar()
        {

            if (!validar(User.Identity.Name))
            {
                return RedirectToAction("Home", "Index");
            }

            DateTime fecha = FormUtils.formatearFecha(Request["fecha"], "dd/MM/yyyy HH:mm");
            String[] arr = Request["parametros"].Split('|');
            for (int i = 0; i < arr.Length - 1; i++)
            {
                String[] arrIds = arr[i].Split(',');
                decimal idSolicitud = Decimal.Parse(arrIds[0]);
                decimal nSeqPaso = Decimal.Parse(arrIds[1]);
                int nSeqActor = Int32.Parse(arrIds[2]);
                //actualizar
                ORIDetSoliActor actor = db.ORIDetSoliActor.Single(o => o.nIdeSolicitud == idSolicitud && o.nSeqPaso == nSeqPaso && o.nSeqActor == nSeqActor);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Detached);
                actor.dtFecRecFisica = fecha;
                db.ORIDetSoliActor.Attach(actor);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Modified);
                db.SaveChanges();

            }

            SolicitudHelper helper = new SolicitudHelper();
            decimal nIdeDep = usuario.nIdeDep.Value;/*debe jalar del usuario*/
            decimal nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
            DateTime fechaIni = FormUtils.formatearFecha(Request["fechaInicio"]);
            DateTime fechaFin = FormUtils.formatearFecha(Request["fechaFin"]).AddDays(1);
            int nroTotal = 0;
            decimal estado = 76;
            List<SolicitudBandeja> lista = helper.getSolicitudList(estado, nIdeDep, nTipoActor, fechaIni, fechaFin, 0, 0, ref nroTotal);

            return View("Filtrar", lista.ToList());
            //return View("Lista(");
        }


        public ViewResult Archivar()
        {

            if (!validar(User.Identity.Name))
            {
                return View("Respuesta");
            }


            String[] arr = Request["parametros"].Split('|');
            for (int i = 0; i < arr.Length - 1; i++)
            {
                String[] arrIds = arr[i].Split(',');

                int solicitudId = Int32.Parse(arrIds[0]);
                decimal nseqPaso = Int32.Parse(arrIds[1]);
                decimal seqActor = Int32.Parse(arrIds[2]);
                String archivo = Request["archivo"];

                //actualizar
                Boolean exito = ArchivarTramite(solicitudId, nseqPaso, seqActor, archivo);

                if (!exito)
                {
                    return View("Respuesta");
                }

            }

            return View("Respuesta");

        }

        public ActionResult Detalle(int id)
        {

            var detalleList = from m in db.ORIDetSolicitud
                              where m.nIdeSolicitud.Equals(id)
                              orderby m.nSeqPaso descending
                              select m;

            ORIDetSolicitud detalle = detalleList.First<ORIDetSolicitud>();
            //.Last(o => o.nIdeSolicitud == id)

            return View(detalle);
        }
        public ViewResult ActualizarFechaLectura(decimal id)
        {
            int nSeqPaso = Int32.Parse(Request["seqPaso"]);
            int nSeqActor = Int32.Parse(Request["seqActor"]);
            decimal nTipoActor = 0;
            if (Request["tipo"].Equals("S"))
            {//SALIDA
                nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
            }
            else
            {
                nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
            }

            ORIDetSoliActor actor = db.ORIDetSoliActor.Single(o => o.nIdeSolicitud == id && o.nSeqPaso == nSeqPaso && o.nSeqActor == nSeqActor && o.nIdeTipoActor == nTipoActor);
            if (actor.dtFecLectura == null)
            {
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Detached);
                actor.dtFecLectura = DateTime.Now;
                db.ORIDetSoliActor.Attach(actor);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Modified);
                db.SaveChanges();
            }
            return View();

        }





        public ActionResult Filtrar()
        {
            SolicitudHelper helper = new SolicitudHelper();
            decimal nIdeDep = Int32.Parse(Request["nIdeDep"]);
            decimal nTipoActor = 0;
            decimal estado = 0;

            if ("T".Equals(Request["tipo"]))
            {
                nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;
                nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                estado = Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL;
            }
            else
            {
                if ("S".Equals(Request["tipo"]))
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                else
                {
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                    estado = 76;
                }
            }


            DateTime fechaIni = FormUtils.formatearFecha(Request["fechaInicio"]);
            DateTime fechaFin = FormUtils.formatearFecha(Request["fechaFin"]).AddDays(1);

            int nroTramites = (Request["nroTramites"] == null) ? Constantes.BANDEJA_NRO_FILAS : Int32.Parse(Request["nroTramites"]);
            int nroPagina = (Request["nroPagina"] == null) ? 1 : Int32.Parse(Request["nroPagina"]);
            int nroTotalRegistros = 0;
            List<SolicitudBandeja> lista = helper.getSolicitudList(estado, nIdeDep, nTipoActor, fechaIni, fechaFin, nroTramites, nroPagina, ref nroTotalRegistros);

            ViewBag.nroTotalRegistros = nroTotalRegistros;
            ViewBag.nroPagina = nroPagina;
            int desde = ((nroPagina - 1) * nroTramites + 1);
            ViewBag.desde = desde;
            ViewBag.hasta = (nroTramites > lista.Count) ? nroTotalRegistros : desde + nroTramites - 1;


            //List<SolicitudBandeja> lista = helper.getSolicitudList(nIdeDep, nTipoActor, fechaIni, fechaFin, 0, 0, ref nroTotal);

            //   Response.Write(orimaesolicitud.ToTraceString());

            return View(lista.ToList());
        }

        public ActionResult Buscar()
        {
            decimal nTipoActor = 0;
            decimal nIdeDep = Int32.Parse(Request["nIdeDep"]);
            decimal estado = 0;
            if ("T".Equals(Request["tipo"]))
            {
                nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;
                nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                estado = Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL;
            }
            else
            {
                if ("S".Equals(Request["tipo"]))
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                else
                {
                    nTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                    estado = 76;
                }
            }

            decimal nAnnSolicitud = Int32.Parse(Request["nAnnSolicitud"]);

            decimal nNumCorrelativo = Int32.Parse(Request["nNumCorrelativo"]);
            decimal nIdeClaseSolicitud = Int32.Parse(Request["nIdeClaseSolicitud"]);
            SolicitudHelper helper = new SolicitudHelper();

            List<SolicitudBandeja> lista = helper.getSolicitudBuscar(estado, nTipoActor, nIdeClaseSolicitud, nIdeDep, nAnnSolicitud, nNumCorrelativo);
            return View("Filtrar", lista.ToList());
        }

        public ActionResult List()
        {

            String fechaInicio = Request["fechaInicio"];
            String fechaFin = Request["fechaFin"];
            String tramites = Request["tramites"];

            ObjectParameter[] parametros = new[]{ 
               new ObjectParameter("fechaInicio", FormUtils.formatearFecha(fechaInicio) ),
               new ObjectParameter("fechaFin", FormUtils.formatearFecha(fechaFin).AddDays(1) )
            };


            ObjectQuery<ORIMaeSolicitud> orimaesolicitud = db.CreateQuery<ORIMaeSolicitud>(
            "SELECT VALUE c FROM orimaesolicitud AS c WHERE  c.dtFecSolicitud >= @fechaInicio and c.dtFecSolicitud<@fechaFin",
            parametros)
            .Include("ORIMaePersona").Include("ORIDetCompendio").Include("ORIDetCompendio4");


            //   Response.Write(orimaesolicitud.ToTraceString());

            return View(orimaesolicitud.ToList());
        }


        private void cargarCombos()
        {

            List<SelectListItem> items = cargarComboBandeja(usuario.nIdeUsu, usuario.nIdeDep);
            HtmlUtils htmlUtils = new HtmlUtils();

            ViewBag.claseSolicitud = htmlUtils.getComboClaseSolicitud();

            ViewBag.Prioridad = htmlUtils.getComboPrioridad();
            ViewBag.Plazo = htmlUtils.getComboPlazo();
            ViewBag.ParaAtender = htmlUtils.getComboParaAtender();

            ViewBag.bandeja = items;

        }

        public Boolean ArchivarTramite(int solicitudId, decimal nseqPaso, decimal seqActor, String archivo)
        {
            decimal nidePara = Constantes.SOLICITUD_PARA.ARCHIVO_FINAL;

            if (archivo.Equals("T"))
                nidePara = Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL;

            try
            {

                SolicitudHelper helper = new SolicitudHelper();
                ORIMaeSolicitud solicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == solicitudId);

                decimal seqPaso = helper.getSeqPasoEvento(solicitudId);

                ORIDetSolicitud eventos = new ORIDetSolicitud();
                eventos.nIdePara = nidePara;
                eventos.nIdePrioridad = Constantes.SOLICITUD_PRIORIDAD_DEFECTO;
                eventos.nPlazo = 0;

                if (eventos.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                {
                    eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                    eventos.vSumilla = "SE DERIVO A ARCHIVO FINAL";

                    db.ORIMaeSolicitud.Attach(solicitud);
                    solicitud.nIdeEstadoSol = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                    db.ObjectStateManager.ChangeObjectState(solicitud, EntityState.Modified);
                    //  db.SaveChanges();


                }
                else
                {
                    eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.PROCESO;
                    eventos.vSumilla = "SE DERIVO A ARCHIVO TEMPORAL";
                }
                eventos.nSeqPaso = seqPaso;
                eventos.dtFecReg = DateTime.Now;
                eventos.nIdeUsuReg = usuario.nIdeUsu;
                eventos.nFolios = 0;


                ORIDetSoliActor detSoliActor = new ORIDetSoliActor();
                int nSeqActor = 1;
                detSoliActor.nSeqActor = nSeqActor;
                detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.PERSONA;
                detSoliActor.nIdeDep = usuario.nIdeDep.Value;
                detSoliActor.dtFecRecepcion = DateTime.Now;
                detSoliActor.dtFecDerivacion = DateTime.Now;
                detSoliActor.dtFecRecFisica = DateTime.Now;

                detSoliActor.nIdeFuncionario = usuario.nIdeFuncionario;
                eventos.ORIDetSoliActor.Add(detSoliActor);


                detSoliActor = new ORIDetSoliActor();
                detSoliActor.nSeqActor = 2;
                detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                detSoliActor.dtFecRecepcion = DateTime.Now;


                detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.AREA;
                if (nidePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                    detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_FINAL;
                else
                    detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;

                eventos.ORIDetSoliActor.Add(detSoliActor);



                eventos.dtFecReg = DateTime.Now;
                eventos.nIdeUsuReg = usuario.nIdeUsu;
                eventos.nIdeSolicitud = solicitudId;

                db.ORIDetSolicitud.AddObject(eventos);

                ORIDetSoliActor actor = db.ORIDetSoliActor.Single(o => o.nIdeSolicitud == solicitudId && o.nSeqPaso == nseqPaso && o.nSeqActor == seqActor && o.nIdeTipoActor == Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Detached);
                actor.dtFecDerivacion = DateTime.Now;
                db.ORIDetSoliActor.Attach(actor);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Modified);

                db.SaveChanges();


                ViewBag.param1 = "OK";
                return true;
            }
            catch (Exception e)
            {

                ViewBag.param1 = "La solicitud no se pudo archivar:" + e.Message;
                return false;

            }

        }


        [HttpPost]
        public ActionResult Index(SolicitudPaso solicitudView)
        {


            if (!validar(User.Identity.Name))
            {
                return RedirectToAction("Home", "Index");
            }

            try
            {

                int idSolicitud = Int32.Parse(Request.Form["solicitudId"]);
                decimal nseqPaso = Int32.Parse(Request.Form["seqPaso"]);
                decimal seqActor = Int32.Parse(Request.Form["seqActor"]);
                DateTime ahora = DateTime.Now;

                SolicitudHelper helper = new SolicitudHelper();
                ORIMaeSolicitud solicitud = db.ORIMaeSolicitud.Single(o => o.nIdeSolicitud == idSolicitud);
                decimal seqPaso = helper.getSeqPasoEvento(idSolicitud);

                ORIDetSolicitud eventos = new ORIDetSolicitud();
                eventos.nIdePara = solicitudView.nIdePara;
                eventos.nIdePrioridad = solicitudView.nIdePrioridad;

                if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                    eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                else
                    eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.PROCESO;

                eventos.nSeqPaso = seqPaso;
                if (solicitudView.nIdePara.Equals(Constantes.SOLICITUD_PARA.ARCHIVO_FINAL) || solicitudView.nIdePara.Equals(Constantes.SOLICITUD_PARA.ARCHIVO_TEMPORAL))
                {

                    eventos.nIdePrioridad = Constantes.SOLICITUD_PRIORIDAD_DEFECTO;//alta

                    if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                    {
                        eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.CONCLUIDO;

                        db.ORIMaeSolicitud.Attach(solicitud);
                        solicitud.nIdeEstadoSol = Constantes.SOLICITUD_ESTADO.CONCLUIDO;
                        solicitud.dtFecResolucion = ahora;
                        db.ObjectStateManager.ChangeObjectState(solicitud, EntityState.Modified);
                        // db.SaveChanges();


                        eventos.nSeqPaso = helper.getSeqPasoEvento(idSolicitud);
                        eventos.dtFecReg = ahora;
                        eventos.nIdeUsuReg = usuario.nIdeUsu;
                        eventos.nFolios = 0;
                        eventos.nPlazo = 0;

                        eventos.vSumilla = solicitudView.sSumilla;

                        ORIDetSoliActor detSoliActor = new ORIDetSoliActor();
                        int nSeqActor = 1;
                        detSoliActor.nSeqActor = nSeqActor;
                        detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_DERIVA;
                        detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.PERSONA;
                        detSoliActor.nIdeDep = usuario.nIdeDep.Value;
                        detSoliActor.dtFecRecepcion = ahora;
                        detSoliActor.dtFecDerivacion = ahora;
                        detSoliActor.dtFecRecFisica = ahora;

                        detSoliActor.nIdeFuncionario = usuario.nIdeFuncionario;
                        eventos.ORIDetSoliActor.Add(detSoliActor);


                        detSoliActor = new ORIDetSoliActor();
                        detSoliActor.nSeqActor = 2;
                        detSoliActor.nIdeTipoActor = Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO;
                        detSoliActor.dtFecRecepcion = ahora;


                        detSoliActor.nIdeTipoCategoria = Constantes.SOLICITUD_CATEGORIA.AREA;
                        if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
                            detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_FINAL;
                        else
                            detSoliActor.nIdeDep = Constantes.SOLICITUD_PARA_DEPENDENCIA.ARCHIVO_TEMPORAL;

                        eventos.ORIDetSoliActor.Add(detSoliActor);


                    }
                    else
                    {
                        eventos.nIdeEstado = Constantes.SOLICITUD_ESTADO.PROCESO;

                        db.ORIMaeSolicitud.Attach(solicitud);
                        solicitud.vSumilla = solicitudView.sSumilla;
                        solicitud.vAccion = solicitudView.sAccion;
                        db.ObjectStateManager.ChangeObjectState(solicitud, EntityState.Modified);

                        db.SaveChanges();

                        cargarCombos();
                        return RedirectToAction("Index", "Bandeja", new { tipo = "T" });
                    }



                }
                else
                {
                    List<SolicitudReferencia> referencias = obtenerReferencias();
                    solicitudView.referencias = referencias;

                    eventos.nIdeTipoDoc = FormUtils.toInt(solicitudView.nIdeTipoDocEntrante);

                    eventos.nPlazo = solicitudView.nPlazo;
                    eventos.nIdePeriodo = solicitudView.nIdePeriodo;
                    eventos.vNumDocum = solicitudView.sNroDocEntrante;
                    eventos.nFolios = solicitudView.nFolios;
                    if (solicitudView.dtFecDocEntrante != null && !solicitudView.dtFecDocEntrante.Equals(""))
                        eventos.dtFecDocum = FormUtils.formatearFecha(solicitudView.dtFecDocEntrante);

                    List<String> errores = helper.cargarDerivados(eventos, solicitudView.sDerivar, usuario);

                    if (errores.ToArray().Length > 0)
                    {
                        foreach (String error in errores)
                        {
                            ModelState.AddModelError("", error);

                        }
                        cargarCombos();

                        return View(solicitudView);
                    }

                    int nSeqArchivo = 0;
                    foreach (SolicitudReferencia referencia in solicitudView.referencias)
                    {
                        if (referencia.nIdTipoDocumento > 0 &&
                            !referencia.vNroDocumento.Equals("") &&
                            !referencia.dFecha.Equals(""))
                        {
                            nSeqArchivo++;
                            ORIDetArchivo detArchivos = new ORIDetArchivo();
                            detArchivos.nIdeTipoDocum = referencia.nIdTipoDocumento;
                            detArchivos.vNumDocum = referencia.vNroDocumento;
                            detArchivos.dtFecDocum = FormUtils.formatearFecha(referencia.dFecha);
                            detArchivos.nSeqPaso = eventos.nSeqPaso;

                            eventos.ORIDetArchivo.Add(detArchivos);
                        }
                    }
                }



                eventos.dtFecReg = DateTime.Now;
                eventos.nIdeUsuReg = usuario.nIdeUsu;
                eventos.nIdeSolicitud = idSolicitud;
                eventos.vSumilla = solicitudView.sSumilla;

                db.ORIDetSolicitud.AddObject(eventos);

                ORIDetSoliActor actor = db.ORIDetSoliActor.Single(o => o.nIdeSolicitud == idSolicitud && o.nSeqPaso == nseqPaso && o.nSeqActor == seqActor && o.nIdeTipoActor == Constantes.SOLICITUD_TIPO_ACTOR.QUE_ES_DERIVADO);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Detached);
                actor.dtFecDerivacion = DateTime.Now;
                db.ORIDetSoliActor.Attach(actor);
                db.ObjectStateManager.ChangeObjectState(actor, EntityState.Modified);

                db.SaveChanges();

                String claseSolicitud = db.ORIDetCompendio.Single(o => o.nIdeDetalle == solicitud.nIdeClaseSolicitud).vNomDetalle;

                ViewBag.nroSolicitud = String.Format("{0:0000}", solicitud.nIdeDep) + "-" + solicitud.nAnnSolicitud + "-" + claseSolicitud.Substring(0, 3) + "-" + String.Format("{0:000000}", solicitud.nNumCorrelativo);
                ViewBag.nIdeSolicitud = solicitud.nIdeSolicitud;
                return View("Confirmacion");
            }
            catch (Exception e)
            {
                Response.Write(e.ToString());
                ModelState.AddModelError("", "La solicitud no se pudo derivar");

            }
            cargarCombos();

            //if (solicitudView.nIdePara == Constantes.SOLICITUD_PARA.ARCHIVO_FINAL)
            return RedirectToAction("Index", "Bandeja", new { tipo = "S" });

            //return View(solicitudView);
        }

        private List<SolicitudReferencia> obtenerReferencias()
        {

            String[] arrTipoDocumento = Request.Form["vTipoDocumento[]"].Split(',');
            String[] arrIdTipoDocumento = Request.Form["nIdTipoDocumento[]"].Split(',');
            String[] arrNroDocumento = Request.Form["vNroDocumento[]"].Split(',');
            String[] arrFecha = Request.Form["dFecha[]"].Split(',');
            String[] arrComentario = Request.Form["vComentario[]"].Split(',');

            int nroReferencias = arrTipoDocumento.Length;
            List<SolicitudReferencia> referencias = new List<SolicitudReferencia>();

            for (int i = 0; i < nroReferencias; i++)
            {
                SolicitudReferencia referencia = new SolicitudReferencia();
                referencia.vTipoDocumento = arrTipoDocumento[i];
                referencia.nIdTipoDocumento = int.Parse(arrIdTipoDocumento[i]);
                referencia.vNroDocumento = arrNroDocumento[i];
                referencia.dFecha = arrFecha[i];
                referencia.vComentario = arrComentario[i];
                referencias.Add(referencia);
            }
            return referencias;
        }

        private List<SelectListItem> cargarComboBandeja(decimal ideUsu, decimal? ideDep)
        {

            ORIMaeDependencia dependencia = db.ORIMaeDependencia.Single(o => o.nIdeDep == ideDep);

            List<ORIDetBandejaUsuario> bandeja1 = db.ORIDetBandejaUsuario.Where(o => o.nIdeUsuBan == ideUsu).ToList();

            List<SelectListItem> items = new List<SelectListItem>();
            items.Add(new SelectListItem() { Text = dependencia.vDescripcion + "<" + String.Format("{0:000}", dependencia.nIdeDep) + ">", Value = dependencia.nIdeDep.ToString() });

            foreach (ORIDetBandejaUsuario bandeja in bandeja1)
            {
                items.Add(new SelectListItem() { Text = bandeja.ORIMaeDependencia.vDescripcion + "<" + String.Format("{0:000}", bandeja.ORIMaeDependencia.nIdeDep) + ">", Value = bandeja.ORIMaeDependencia.nIdeDep.ToString() });

            }

            return items;
        }
    }
}
